# -*- coding: utf-8 -*-
"""
分类控制器
目的：处理分类相关的HTTP请求，提供RESTful API端点
职责：接收HTTP请求、参数验证、调用服务层、返回响应
"""
from flask import Blueprint, request, jsonify
from app.services.category_service import CategoryService
from app.utils.auth import token_required, get_current_user
from app.utils.response import bad_request_response, internal_error_response, not_found_response


# 创建分类蓝图对象，用于注册分类相关的路由
category_bp = Blueprint('category', __name__, url_prefix='/api/categories')


@category_bp.route('', methods=['POST'])
@token_required
def create_category():
    """
    创建分类API
    目的：处理分类创建请求，验证参数并调用服务层创建分类
    功能：接收分类数据、验证必填字段、调用业务逻辑、返回结果

    请求头:
        Authorization: Bearer <token> - JWT认证令牌

    请求体:
    {
        "name": "分类名称",           // 必填，字符串，最长100字符
        "description": "分类描述",    // 可选，字符串，分类说明
        "parent_id": 1,               // 可选，整数，父分类ID，不传表示顶级分类
        "sort_order": 0               // 可选，整数，排序顺序，默认0
    }

    响应:
    {
        "code": 200,
        "message": "分类创建成功",
        "data": {
            "id": 1,
            "name": "分类名称",
            "description": "分类描述",
            "parent_id": null,
            "sort_order": 0,
            "status": 1,
            "created_at": "2025-10-01T12:00:00",
            "updated_at": "2025-10-01T12:00:00"
        }
    }
    """
    try:
        # 解析请求体中的JSON数据
        data = request.get_json()

        if not data:
            return bad_request_response('请求数据格式错误')

        # 提取必填字段
        name = data.get('name')

        # 验证必填字段
        if not name:
            return bad_request_response('分类名称为必填项')

        # 提取可选字段
        description = data.get('description')
        parent_id = data.get('parent_id')
        sort_order = data.get('sort_order', 0)

        # 调用服务层创建分类
        result = CategoryService.create_category(
            name=name,
            description=description,
            parent_id=parent_id,
            sort_order=sort_order
        )

        # 返回Result对象的响应
        return result.to_response()

    except Exception as e:
        return internal_error_response(f'创建分类失败：{str(e)}')


@category_bp.route('/<int:category_id>', methods=['PUT'])
@token_required
def update_category(category_id):
    """
    更新分类API
    目的：处理分类编辑请求，支持部分字段更新
    功能：接收更新数据、调用服务层更新分类

    请求头:
        Authorization: Bearer <token> - JWT认证令牌

    路径参数:
        category_id (int): 分类ID

    请求体（所有字段可选）:
    {
        "name": "更新后的名称",
        "description": "更新后的描述",
        "parent_id": 2,
        "sort_order": 10,
        "status": 1
    }

    响应:
    {
        "code": 200,
        "message": "分类更新成功",
        "data": {更新后的分类完整信息}
    }
    """
    try:
        # 解析请求体中的JSON数据
        data = request.get_json()

        if not data:
            return bad_request_response('请求数据格式错误')

        # 提取可选字段
        name = data.get('name')
        description = data.get('description')
        parent_id = data.get('parent_id')
        sort_order = data.get('sort_order')
        status = data.get('status')

        # 调用服务层更新分类
        result = CategoryService.update_category(
            category_id=category_id,
            name=name,
            description=description,
            parent_id=parent_id,
            sort_order=sort_order,
            status=status
        )

        # 返回Result对象的响应
        return result.to_response()

    except Exception as e:
        return internal_error_response(f'更新分类失败：{str(e)}')


@category_bp.route('/<int:category_id>', methods=['DELETE'])
@token_required
def delete_category(category_id):
    """
    删除分类API
    目的：处理分类删除请求，支持软删除和强制删除
    功能：调用服务层删除分类

    请求头:
        Authorization: Bearer <token> - JWT认证令牌

    路径参数:
        category_id (int): 分类ID

    查询参数:
        force (int): 可选，是否强制删除，1-物理删除，0或不传-软删除

    响应:
    {
        "code": 200,
        "message": "分类已禁用" 或 "分类删除成功"
    }
    """
    try:
        # 获取是否强制删除的参数
        force = request.args.get('force', 0, type=int)

        # 调用服务层删除分类
        result = CategoryService.delete_category(
            category_id=category_id,
            force=bool(force)
        )

        # 返回Result对象的响应
        return result.to_response()

    except Exception as e:
        return internal_error_response(f'删除分类失败：{str(e)}')


@category_bp.route('/<int:category_id>', methods=['GET'])
def get_category(category_id):
    """
    获取分类详情API
    目的：根据分类ID查询分类信息
    功能：查询分类详情

    路径参数:
        category_id (int): 分类ID

    响应:
    {
        "code": 200,
        "message": "获取分类成功",
        "data": {分类详细信息}
    }
    """
    try:
        # 调用服务层获取分类
        result = CategoryService.get_category_by_id(category_id)

        # 返回Result对象的响应
        return result.to_response()

    except Exception as e:
        return internal_error_response(f'获取分类失败：{str(e)}')


@category_bp.route('/tree', methods=['GET'])
def get_categories_tree():
    """
    获取分类树形结构API
    目的：查询所有分类并组织成树形结构，用于前端展示
    功能：返回分类的层级关系树

    查询参数:
        status (int): 可选，分类状态筛选，1-启用，0-禁用，不传则只返回启用的分类

    响应:
    {
        "code": 200,
        "message": "获取分类树成功",
        "data": [
            {
                "id": 1,
                "name": "顶级分类1",
                "description": "描述",
                "parent_id": null,
                "sort_order": 0,
                "status": 1,
                "children": [
                    {
                        "id": 2,
                        "name": "子分类1",
                        "description": "描述",
                        "parent_id": 1,
                        "sort_order": 0,
                        "status": 1,
                        "children": []
                    }
                ]
            }
        ]
    }
    """
    try:
        # 从查询参数获取状态筛选条件
        status = request.args.get('status', 1, type=int)

        # 调用服务层获取分类树
        result = CategoryService.get_categories_tree(status=status)

        # 返回Result对象的响应
        return result.to_response()

    except Exception as e:
        return internal_error_response(f'获取分类树失败：{str(e)}')
